﻿using System;
using System.Collections.Generic;
using System.Text;

namespace IllusstraatedCsharp7_ch11_Struct
{
    /*结构的实例构造函数
       对于每个结构，都存在一个无参数的构造函数，而且不能删除或重定义。但是可以创建另外的构造函数只要它们有参数
        对于类，编译器只在没有声明其它构造函数是提供隐式的无参数构造函数
       调用一个构造函数，包括隐式无参数构造函数，要使用new运算符。
     */
    struct Simple
    {
        public int X;
        public int Y;
        public static int X1;
        public static int Y1;
        public Simple(int a, int b)  //带有参数的构造函数
        {
            X = a;
            Y = b;
        }

         static Simple()
        {
            X1 = 12;
            Y1 = 14;
        }
    }
    class Chapt11_4ConstructorAndDestructor
    {
        static void Main()
        {
            Simple s1 = new Simple();   //调用隐式构造函数
            Simple s2 = new Simple(5, 10);  //调用构造函数

            Console.WriteLine($"{s1.X},{s1.Y}");
            Console.WriteLine($"{s2.X},{s2.Y}");

            /*也可以不使用new运算符创建结构实例。然而，如果这样做，有一些限制，如下
             * 在显式设置数据成员之后，才能使用它们的值；
             * 在对所有数据成员赋值之后，才能调用结构的函数成员                
             */
            Simple s3, s4;
            //Console.WriteLine("{0},{1},"s3.X,s4.Y); //编译错误
            s3.X = 5;
            s3.Y = 10;
            Console.WriteLine($"{s3.X},{s3.Y}");
        }
    }
}
